// #include <iostream>
// #include <string>
//
// using namespace std;
//
// //1.类和对象 多个具有相同属性和行为的事务的抽象
// //属性 事物的特征 数据成员
// //行为 操作 成员函数
//
// // 对象就是类的具体化
//
//
// //学会创建类
// //创建class 空类一个字节
// class MM {
//     //没有写权限限定词 默认私有属性
//     string num{"abc"}; //私有属性
// public: //公有
//     //通常习惯把一个类中的共有属性称为接口
//     string name="xiaofang";
//     void print() {
//         cout << name << num << money <<endl;
//     }
//     void print_data();
// protected: //保护
// private://私有
//     int money=10;
// };
// //权限限定词 --->用来限定类外对象对于类中属性的访问
//
// void MM::print_data() {
//     cout << name << money << endl;
// }
//
// //构造函数和析构函数
// //构造是类中特殊的函数
// //要点 1. 写法 函数名和类名相同 没有返回值 参数随意
// //作用 ：构造函数是负责创建对象所以一般情况构造函数是public属性
// //机制 不写构造函数 存在一个默认的无参的构造函数 自己写了任何形式的构造函数 默认的就不存在
// //调用 创建对象的时候 自己去调用构造函数 所以对象的长相（参数）必须和构造函数已知
//
// class GG {
// public:
//     GG(string name,int age) {
//         this->g_name=name;
//         this->g_age=age;
//         cout << "无参构造函数" << endl;
//     }
//     void print() {
//         cout << g_name << g_age << endl;
//
//     }
// protected:
//     string g_name;
//     int g_age;
// private:
// };
//
// class Girl {
// public:
//     Girl() {
//         cout << "无参"  << endl;
//     }
//     Girl(string name,int age) {
//         this->g_name=name;
//         this->g_age=age;
//     }
//     void print() {
//         cout << g_name << g_age << endl;
//     }
// protected:
//     string g_name;
//     int g_age;
// private:
// };
//
// class Boy {
// public:
//     Boy(string name,int age=1) {
//         this->g_name=name;
//         this->g_age=age;
//     }
// protected:
//     string g_name;
//     int g_age;
// private:
//
// };
//
// //两个关键字 default delete
// class CoolMan {
//     public:
//     //代表删除默认的构造函数
//     CoolMan()=delete;
// protected:
// public:
// };
//
// class Beauty {
// public:
//     //使用默认的额无参构造函数
//     Beauty()=default;
// protected:
//     string name;
// private:
// };
// //构造函数类外实现 类名限定
//
//
//
//
//
//
// int main() {
//     //创建对象
//     MM object;
//     object.print_data();
//     object.print();
//     //类外只能访问共有属性
//     // object.num //不让访问  权限限定符限制了
//
//     //new一个对象
//     MM* p = new MM;
//     p->print_data();
//
//     //除了特殊的成员之外类中的成员必须通过对象访问
//     // GG g; 因为写了构造函数 无参的构造函数不存在 所以不能创建无参对象 //错误 没有合适的构造函数
//     //构造函数 两个参数
//     GG* g = new GG("xiaowang",1);
//     g->print();
//     //为了能够构建不同对象 所以通常构造函数写多个 通过函数重载和函数缺省去实现
//     Girl object1;
//     Girl object2("小芳",1);
//
//     object1.print();
//     object2.print();
//
//     Boy b1("消防");
//     Boy b2("消防",2);
//
//
//     Beauty b3;
//
//
//
//
//
//     return 0;
// }